package com.lucidworks.storm.eventsim;
import backtype.storm.generated.StormTopology;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.tuple.Fields;
import com.lucidworks.storm.StormTopologyFactory;
import com.lucidworks.storm.StreamingApp;
import com.lucidworks.storm.solr.HashRangeGrouping;
import com.lucidworks.storm.spring.SpringBolt;
import com.lucidworks.storm.spring.SpringSpout;
public class EventsimTopology implements StormTopologyFactory {
static final Fields spoutFields = new Fields("id","line");
public String getName() {
return "eventsim";
}
public StormTopology build(StreamingApp app) throws Exception {
SpringSpout eventsimSpout = new SpringSpout("eventsimSpout", spoutFields);
SpringBolt collectionPerTimeFrameSolrBolt = new SpringBolt("collectionPerTimeFrameSolrBoltAction",
app.tickRate("collectionPerTimeFrameSolrBoltAction"));
// Send all docs for the same hash range to the same bolt instance,
// which allows us to use a streaming approach to send docs to the leader
int numShards = Integer.parseInt(String.valueOf(app.getStormConfig().get("spring.eventsimNumShards")));
HashRangeGrouping hashRangeGrouping = new HashRangeGrouping(app.getStormConfig(), numShards);
int tasksPerShard = hashRangeGrouping.getNumShards()*2;
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("eventsimSpout", eventsimSpout, app.parallelism("eventsimSpout"));
builder.setBolt("collectionPerTimeFrameSolrBolt", collectionPerTimeFrameSolrBolt, tasksPerShard)
.customGrouping("eventsimSpout", hashRangeGrouping);
return builder.createTopology();
}
}